// 访问器装饰器，是用来装饰访问器的get set
// 属性装饰器 用来装饰类的属性（target:object,propertyKey:string|Symbol）=>void
// 1.元数据添加,实现参数的校验
import 'reflect-metadata';


/*
* @param target  装饰器的目标对象，对于静态属性来说就是类的构造函数，对于实例属性来说就是类的原型对象
* @param propertyKey 装饰的属性名称
**/ 
function required(message){
    return function(target,propertyKey){
        console.log(target === Animal.prototype);
        
        Reflect.defineMetadata('required',true,target,propertyKey)
        Reflect.defineMetadata('requiredMessage',message,target,propertyKey)
    }
}

function validate(animal:Animal){
    for(let k in animal){
        if(Reflect.getMetadata('required',animal,k) && !animal[k]){
            throw new Error(Reflect.getMetadata('requiredMessage',animal,k))
        }
    }
}

class Animal{
    @required('weight不能为空或0')
    public weight:number;
}
const cat = new Animal();
cat.weight = 0;
validate(cat);
